package com.ray.springboot.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * swagger API 文档配置类
 * Configuration /可以使 spring 启动就加载该类，如果这两个配置文件不加，则项目启动后，打开Swagger页面后，内容为空。
 * ConfigurationProperties / 和Configuration Data 配合使用，读取配置文件对象，要和属性名对应
 * EnableSwagger2 / 标注该类是Swagger的配置类
 * EnableOpenApi / Swagger增强版 - Knife4j
 * <br>
 * 访问地址：http://项目实际地址/doc.html
 * 使用 端口号为后端
 * http://localhost:48601/doc.html
 *
 * @author LiaoYuXing-Ray 2024/7/30 21:42
 **/
@Configuration
@ConfigurationProperties(prefix = "ray.swagger")
@Data
//@EnableSwagger2
@EnableOpenApi
public class SwaggerConfig {

    private String title;
    private String version;
    private String description;
    private String basePackage;
    private String concat;
    private String url;
    private String email;
    private String license;
    private String licenseUrl;


    /**
     * 配置了swaggerDocket的bean实例
     * 创建API应用
     * apiInfo() 增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现，
     * 采用指定扫描的包路径来定义指定要建立API的目录。
     *
     * @return {@link Docket}
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 配置 swagger 信息apiInfo
                .apiInfo(new ApiInfoBuilder()
                        // 大标题
                        .title(title)
                        // 版本
                        .version(version)
                        // 描述
                        .description(description)
                        // 作者信息
                        .contact(new Contact(concat, url, email))
                        // 网站链接显示文字
                        .license(license)
                        // 网站链接
                        .licenseUrl(licenseUrl)
                        .build())
                .select()
                .apis(RequestHandlerSelectors.basePackage(basePackage))
                // 过滤路经
                .paths(PathSelectors.any())
                .build();
    }

}
